package com.woniuxy.microfixeddepositserver.timer;

import com.woniuxy.bean.regularbean.MemberAccountInnerBean;
import com.woniuxy.microfixeddepositserver.dao.FixedTimeDepositDao;
import com.woniuxy.microfixeddepositserver.dao.RegularDao;
import lombok.extern.slf4j.Slf4j;
import org.joda.time.DateTime;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.List;
import java.util.Random;

/**
 * @author: masterhai
 * @date: 2021/4/13:17:01
 * @description: 更新每日收益定时任务
 */
@Component
@Slf4j
public class UpdateEarningsTask {
    @Resource
    private FixedTimeDepositDao fixedTimeDepositDao;
    @Resource
    private RegularDao regularDao;

    //定时任务,每天8点执行收益更新操作
    @Scheduled(cron = "0 36 9 * * ?")
    public void testTimeTask () {
        System.out.println("执行了");
        //确定年份天数
        Integer days = 365;
        Integer year = Integer.valueOf(new DateTime().toString("yyyy"));
        if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {//闰年的判断规则
            days = 366;
        }
        //获取当前用户购买的所有产品信息
        List<MemberAccountInnerBean> regularsList = fixedTimeDepositDao.getRegulars();
        Random random = new Random();
        for (int i = 0; i < regularsList.size(); i++) {
            MemberAccountInnerBean bean = regularsList.get(i);
            //判断当天是否属于收益计算日
            Integer todayTime = Integer.valueOf(new DateTime().toString("yyyyMMdd"));
            if (todayTime.equals(bean.getCalculateEarningsDay()) && bean.getConfirmCapital() - 0 == 0) {
                //将未生效金额移入已生效金额
                bean.setConfirmCapital(bean.getUnConfirmCapital());
                //未生效金额重置为0
                bean.setUnConfirmCapital(0.0);
            }
            //获取确认计息的本金
            Double confirmCapital = bean.getConfirmCapital();
            //年利率
            Double yieldRates = bean.getYieldRates();
            //获取日利率
            double dayRates = yieldRates / days;
            //获取当天倍率
            double rate = (random.nextInt(100) + 50) / 100d;
            //收益
            double todayEarnings = confirmCapital * dayRates * rate;
            //获取平台的收益
            Integer deduct = fixedTimeDepositDao.getPlatformDeduct(bean.getFixedDepositId());
            if (deduct > 0 && deduct <= 100 && todayEarnings > 0) {
                Double trusteeFee = todayEarnings * deduct / 100;
                todayEarnings -= trusteeFee;
                //储存平台收益
                regularDao.saveTrusteeFee("定期", trusteeFee);
            }
            //封装数据,当前产品当日收益
            bean.setTodayEarnings(todayEarnings);
            //总收益
            Double totalEarnings = bean.getTotalEarnings() + todayEarnings;
            bean.setTotalEarnings(totalEarnings);

            //产品总价值(生效本金+未生效本金+总收益收益)
            bean.setOverAllBalance(bean.getConfirmCapital() + bean.getUnConfirmCapital() + totalEarnings);
        }
        //更新收益
        fixedTimeDepositDao.updateEarnings(regularsList);


    }


// cron表达式的基本使用：
// 　 组成部分：秒 分 小时 日期 月份 星期 年(可选)
// 字段 允许值 允许的特殊字符
// 秒 0-59 , - * /
// 分 0-59 , - * /
// 小时 0-23 , - * /
// 日期 1-31 , - * ? / L W C
// 月份 1-12 或者 JAN-DEC , - * /
// 星期 1-7 或者 SUN-SAT , - * ? / L C #
// 年（可选） 留空, 1970-2099 , - * /
// 表达式意义
// "0 0 12 * * ?" 每天中午12点触发
// "0 15 10 ? * *" 每天上午10:15触发
// "0 15 10 * * ?" 每天上午10:15触发
// "0 15 10 * * ? *" 每天上午10:15触发
// "0 15 10 * * ? 2005" 2005年的每天上午10:15触发
// "0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发
// "0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发
// "0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
// "0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发
// "0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发
// "0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发
// "0 15 10 15 * ?" 每月15日上午10:15触发
// "0 15 10 L * ?" 每月最后一日的上午10:15触发
// "0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
// "0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发
// "0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发
// 每天早上6点
// 0 6 * * *
// 每两个小时
// 0 */2 * * *
// 晚上11点到早上8点之间每两个小时，早上八点
// 0 23-7/2，8 * * *
// 每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
// 0 11 4 * 1-3
// 1月1日早上4点
// 0 4 1 1 *
}
